// =============================================================================
// Large Choices
// =============================================================================
/*:
@plugindesc 将多个显示选项组合成一个列表。
@author Hime
@date Oct 23, 2015
@help 
== 描述 ==

默认情况下RPG Maker 选项列表只提供6个选项，
这个脚本能够将多个选项合并成为一个大选项列表。

为了正确的使用本插件提供的功能，请仔细阅读下方
默认选择和默认取消选项的使用方法。
 
== 使用 == 

-- 合并选项 --

要将两组选项合并为一组即6+6的选项非常简单，你只需要创建两个6选项
在它们间不要加入任何其他命令，它们将会在游戏时自动合并成为12个选项
的选项列表。

-- 自定义默认选项 --

游戏中默认确认选项的位置。
假设你设置了以下8个选项:

显示选项   #1
  选项 1 #1
  选项 2 #2
  选项 3 #3
  选项 4 #4
  选项 5 #5
  选项 6 $5
显示选项   #2
  选项 7 #1
  选项 8 #2
  
当你想设置默认选项为第8的时候，只需要将显示选项#1默认确认选项设置为"无"，
在显示选项#2，的默认确认选项中设置"选项#2"即可。
已知BUG：如果设置默认确认选项为第1组选项后的任何一组选项的第1个选项，都可能无效。

-- 自定义取消选项 --

当你想设置默认取消项为第1组以外的其他选项时，请将你要设置的选项所在组以外的所有组
取消设置都设置为"不允许"，想要设置分支也按这个方法设置。


-自颖叔の汉化
 */ 
 
// =============================================================================
// 其他
// =============================================================================
(function() {
  var _TH_Game_Interpreter_setupChoices = Game_Interpreter.prototype.setupChoices;
  Game_Interpreter.prototype.setupChoices = function(params) {  
    params = this.combineChoices()
    _TH_Game_Interpreter_setupChoices.call(this, params)      
  };

  Game_Interpreter.prototype.combineChoices = function(params) {  
    /* IMPORTANT If we don't clone this, we will modify the event permanently */
    this._list = JSON.parse(JSON.stringify(this._list))
    var currIndex = this._index
    var numChoices = 0;
    var firstCmd = this._list[this._index];
    this._index++;
    while (this._index < this._list.length) {
      var cmd = this._list[this._index]
      if (cmd.indent === this._indent)
      
        /* Reached "End Choices" command. See if next command is "Show Choices" */
        if (cmd.code === 404 && this._list[this._index+1].code !== 102) {
          break
        }
        else if (cmd.code === 102) {

          /* Update cancel choice.
           * -2 is "cancel"
           * -1 is "disallow"
           * 0 to 5 are zero-indexed choices
           */
          var cancelType = cmd.parameters[1]
          if (cancelType > 0) {
            firstCmd.parameters[1] = cancelType + numChoices
          }
          else if (cancelType === -2) {
            firstCmd.parameters[1] = cancelType;            
          }
          
          /* Update default choice */
          var defaultType = cmd.parameters[2]
          if (defaultType > 0) {
            firstCmd.parameters[2] = defaultType + numChoices;
          }
          
          /* Add all of the parameters to the current command */
          var options = cmd.parameters[0];                    
          for (var i = 0; i < options.length; i++) {
            firstCmd.parameters[0].push(options[i]);
          }    
          
          /* Delete the "end choice" and "show choice" commands */
          this._list.splice(this._index - 1, 2)
          this._index -= 2;
        }
        
        /* Update the branch number */
        else if (cmd.code === 402) {          
          cmd.parameters[0] = numChoices;
          numChoices++;
        }
        this._index++;
      }
    /* Go back to where we left off */
    this._index = currIndex;    
    
    /* Return the new parameters for the first choice command */
    return firstCmd.parameters;
  }  
}());